Constantemente obtengo el error
No vinculado a una cámara válida
al intentar implementar el caso de uso de imageCapture. Estoy implementando la función en Java siguiendo el tutorial de camerax aquí .
El caso de uso de vista previa se vincula correctamente y puedo acceder a la cámara cuando inicio la actividad, pero cuando toco el botón "tomar foto", aparece el siguiente error:
Photo capture failed: ${exception.message} androidx.camera.core.ImageCaptureException: Not bound to a valid Camera [ImageCapture:androidx.camera.core.ImageCapture-9aad1b57-8fb6-4a6e-b528-9347343369b6] at androidx.camera.core.ImageCapture.lambda$sendImageCaptureRequest$6$ImageCapture(ImageCapture.java:825) at androidx.camera.core.-$$Lambda$ImageCapture$2B91NcXQyr59NDscigcxsZb94mc.run(Unknown Source:4) at android.os.Handler.handleCallback(Handler.java:938) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:223) at android.app.ActivityThread.main(ActivityThread.java:7656) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)¿Alguien enfrenta un problema similar? ¿Algún consejo?
cameraProvider.bindToLifecycle( this, cameraSelector, preview, imageCapture)Para solucionar este problema, debe vincular las colecciones de UseCase a lifeCycleOwner .
¿Cuál es el caso de uso :
Un UseCase proporciona funcionalidad para asignar el conjunto de argumentos en un caso de uso a argumentos que una cámara puede usar. UseCase también comunicará el estado activo/inactivo a la cámara.
Primero debe tener las dependencias a continuación en su build.gradel :
dependencies { /* rest of your implementation */ // CameraX core library using the camera2 implementation def camerax_version = "1.1.0-alpha03" // The following line is optional, as the core library is included indirectly by camera-camera2 implementation "androidx.camera:camera-core:${camerax_version}" implementation "androidx.camera:camera-camera2:${camerax_version}" // If you want to additionally use the CameraX Lifecycle library implementation "androidx.camera:camera-lifecycle:${camerax_version}" }Y ahora puedes enlazarlo usando:
public androidx.camera.core.Camera bindToLifecycle(@NonNull @NotNull androidx.lifecycle.LifecycleOwner lifecycleOwner, @NonNull @NotNull androidx.camera.core.CameraSelector cameraSelector, @NonNull @NotNull androidx.camera.core.UseCase... useCases)Por ejemplo, tengo este código en mi MainActivity:
Para Java :
UseCase imageCapture = new ImageCapture.Builder() .setCaptureMode(ImageCapture.CAPTURE_MODE_MAXIMIZE_QUALITY) .build(); ListenableFuture<ProcessCameraProvider> providerListenableFuture = ProcessCameraProvider.getInstance(this); ProcessCameraProvider processCameraProvider = providerListenableFuture.get(); processCameraProvider.bindToLifecycle(this, CameraSelector.DEFAULT_BACK_CAMERA, imageCapture);Y para Kotlin :
val outputFileOptions = ImageCapture.OutputFileOptions.Builder(file).build() val imageCapture = ImageCapture.Builder() .setCaptureMode(ImageCapture.CAPTURE_MODE_MAXIMIZE_QUALITY) .build() val cameraProviderFuture: ListenableFuture<ProcessCameraProvider> = ProcessCameraProvider.getInstance(this) val processCameraProvider = cameraProviderFuture.get() processCameraProvider.bindToLifecycle(this, CameraSelector.DEFAULT_BACK_CAMERA, imageCapture)Para más detalles consulte la implementación de CameraX en la documentación oficial
Asegúrese de enlazar también para la preview y la captura de imagen al hacer imageCapture
// Bind use cases to camera cameraProvider.bindToLifecycle(this, cameraSelector, imageCapture, preview)